//
//  SinaAccountViewModel.swift
//  WeiBo
//
//  Created by Apple on 15/12/31.
//  Copyright © 2015年 itcast. All rights reserved.
//

import UIKit
import AFNetworking

// ViewM0del会写一定逻辑

class SinaAccountViewModel: NSObject {

    // Swfit 单例 
    static let shareInstance = SinaAccountViewModel()
    
    // 创建一个model属性
    var model: SinaAccountModel?
    /*
        model读取值 有2种情况
        第一种是 根据授权的时候,给他赋值,这个只有在授权的时候才赋值
        第二种方式,就是需要从沙盒里读取
    
    */
    
    //定义一个 是否登录 的 boolean值,来记录我是否登录
    var isLogin : Bool {
        
        //只返回一个 get方法
//        get{
//        
//          return (SinaAccountViewModel.shareInstance.access_token == "") ? false : true
//            
//        }

        return (SinaAccountViewModel.shareInstance.access_token == "") ? false : true
    }
    
    var access_token: String {
        return model?.access_token ?? ""
    }
    // 在 ViewModel构造函数里,给我们的 model赋值
    override init() {
        
        model = SinaAccountModel.readUserInfo()
        
    }
    
    //MARK:-- 获取网络请求,来 获取 Token
    func getToken(code:String,success: ()->(),failure: (error: NSError)->()){
        
        // 1 创建一个实例
        let afn = AFHTTPSessionManager()
        
        // 1.1 增加解析类型 -- 有一个 插入方法
        afn.responseSerializer.acceptableContentTypes?.insert("text/plain")
        // 2 拼接参数
        /*
        client_id	true	string	申请应用时分配的AppKey。
        client_secret	true	string	申请应用时分配的AppSecret。
        grant_type	true	string	请求的类型，填写authorization_code
        
        grant_type为authorization_code时
        必选	类型及范围	说明
        code	true	string	调用authorize获得的code值。
        redirect_uri	true	string	回调地址，需需与注册应用里的回调地址一致
        */
        let params = [ "client_id": app_Key,
            "client_secret":app_Secret,
            "grant_type":"authorization_code",
            "code":code,
            "redirect_uri":redirect_Url
            
        ]
        
        // 3 发送数据请求
        afn.POST("https://api.weibo.com/oauth2/access_token", parameters: params, success: { (_ , JSON) -> Void in
            
            printLog(JSON)
            
            /*
            "access_token" = "2.00cYTHKG0gkcu5a8f698925cEIKSwB";
            2.00cYTHKG0gkcu5a8f698925cEIKSwB
            "expires_in" = 100;
            2015-12-31 15:01:40
            "remind_in" = 157679999;
            uid = 5646342270;
            */
            
            
            // 把JSON进行转换
            let dict = JSON as? [String:AnyObject]
            
            if let dic = dict {
                
                //字典转模型
                let account = SinaAccountModel(dic: dic)
                
                //第三大步!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                // 获取到Token之后,进行获取个人信息的请求 -- 必须得有Token,因为Token是我们网络访问的必须参数
                self.getPersonalInfo(account, success: success, failure: failure)
            }
            
            
            }) { (_ , error) -> Void in
                printLog(error)
                failure(error: error)
        }
        
    }
    
    
    //MARK:--第三大步
    //MARK:-- 通过Token,来获取用户信息
    func getPersonalInfo(accessModel: SinaAccountModel,success: ()->(),failure: (error: NSError)->()){
        
        // 加一个判断
        if accessModel.access_token == nil || accessModel.uid == nil{
            
            fatalError("必须有 用户accesstoken,还有 uid")
        }
        
        // 1. 创建一个 afn实例
        let afn = AFHTTPSessionManager()
        
        // 2 拼接参数
        /*
        source	false	string	采用OAuth授权方式不需要此参数，其他授权方式为必填参数，数值为应用的AppKey。
        access_token	false	string	采用OAuth授权方式为必填参数，其他授权方式不需要此参数，OAuth授权后获得。
        uid	false	int64	需要查询的用户ID。
        screen_name	false	string	需要查询的用户昵称。
        
        注意!!!!!!!!
        参数uid与screen_name二者必选其一，且只能选其一；
        */
        let  params = ["access_token": accessModel.access_token!,
            "uid":accessModel.uid!]
        
        //[String : String?] 这个类型 对于 AnyObject? 不能够转换
        //我们必须把 [String : String?] 转换成 [String : String]
        
        // 3 发送网络请求
        afn.GET("https://api.weibo.com/2/users/show.json", parameters: params, success: { (_ , JSON) -> Void in
            
            printLog(JSON)
            
            if let  dic  = JSON as? [String:AnyObject]{
                
                /*
                dic 是一个 [String : AnyObject]类型的字典,
                通过key获取到 的值是 AnyObject
                accessModel.screen_name 他是 String类型
                不同类型直接不可以赋值,所以需要我们 把 AnyObject 转换成 String
                
                as! 和 as? 取决于 我前边值
                */
                accessModel.screen_name = dic["screen_name"] as? String
                accessModel.profile_image_url = dic["profile_image_url"] as? String
                
                //重要!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                // 第四大步-- 保存用户信息
                accessModel.saveInfo()
                
                // 第一个地方 给 ViewModel里的 model赋值
                self.model = accessModel
                
                // 进行回调,告诉我第一个方法,我这里 第一步,第二步,第三步 都成功了.
                success()
            }
            
            
            }) { (_ , error ) -> Void in
                
                printLog(error)
                failure(error: error)
        }
        
        
    }

    
    
}
